import 'dart:io';

/// 该文件用于生成图标文件对应的数组
///
/// 需要先配置好dart环境-让控制台可以执行 dart --version命令,
/// mac配置:
/// export DART_HOME=$PATH:$HOME/flutter/bin/cache/dart-sdk/bin
/// export PATH="$PATH:$DART_HOME"
///
/// 然后执行该文件,可自动生成对应的icon图标数组
/// 可以再vsCode中安装 code runner 插件,右上角点击运行该文件
///
/// 也可以直接控制台命令运行
///
/// dart tools/materialIcons/main.dart
void main() {
  _createCustomIcons();
}

_createCustomIcons() async {
  //提示：pub中有ini库可以方便的对ini文件进行解析
  // File file = new File("tools/materialIcons/sources/icons.dart");
  File file = File.fromUri(Uri(path: "tools/materialIcons/sources/icons.dart"));
  //如果文件存在，删除
  if (!await file.exists()) {
    //创建文件
    file = await file.create();
  } else {
    //删除文件
    await file.delete();
  }

  // 文件模式设置为追加
  IOSink isk = file.openWrite(mode: FileMode.append);
  // 多次写入
  isk.writeln("import 'package:flutter/material.dart';");
  isk.writeln('');
  isk.writeln('class MaterialIcons {');
  isk.writeln('  static Map<String, IconData> icons = {');
  await _readIconsFils(isk);
  isk.writeln('  };');
  isk.writeln('}');
  await isk.close();
}

/// 输出每一行
_readIconsFils(IOSink isk) async {
  // 读取icons源文件
  File file = new File("tools/materialIcons/resources/icons.txt");

  // 如果文件存在，删除
  if (!await file.exists()) {
    // 创建文件
    file = await file.create();
  }
  print("文件内容:$file");

  // 以行为单位读取文件到List<String>，默认为UTF8编码
  print("\n读取每一行, 并写入文件");
  List<String> lines = await file.readAsLines();
  lines.forEach((String line) {
    var outName = _outIconName(line);
    if (outName != null) {
      isk.writeln('    "$outName": Icons.$outName,');
    }
  });
}

/// 获取Icons中对应的名称
String? _outIconName(String line) {
  String startStr = "  static const IconData ";
  int startIndex = line.indexOf(startStr);
  int endIndex = line.indexOf(' = ');
  // 截取'='号与'IconData'之间的字符串并返回
  if (startIndex > -1) {
    return line.substring(
      startIndex + startStr.length,
      endIndex,
    );
  }
  return null;
}

//如果是以字节方式写入文件
//建议设置好编码，避免汉字、特殊符号等字符出现乱码、或无法读取
//将字符串编码为Utf8格式，然后写入字节
// file = await file.writeAsBytes(utf8.encode("class Icons {"),
//     mode: FileMode.append);
// file = await file.writeAsBytes(utf8.encode("static List icons = [];"),
//     mode: FileMode.append);
// file = await file.writeAsBytes(utf8.encode("}"), mode: FileMode.append);

//直接调用File的writeAs函数时
//默认文件打开方式为WRITE:如果文件存在，会将原来的内容覆盖
//如果不存在，则创建文件

//写入String，默认将字符串以UTF8进行编码
// file = await file.writeAsString("[General]\nCode=UTF8");

//readAsString读取文件，并返回字符串
//默认返回的String编码为UTF8
//相关的编解码器在dart:convert包中
//包括以下编解码器：ASCII、LANTI1、BASE64、UTF8、SYSTEM_ENCODING
//SYSTEM_ENCODING可以自动检测并返回当前系统编码
// print("\nRead Strings:\n${await file.readAsString()}");

//读取字节，并用Utf8解码
// print("\nRead Bytes:");
// print(utf8.decode(await file.readAsBytes()));
